/**
 * 输入N，输出坐标
 * @param n
 */
export const spiralPrint = (n) => {
    // 计算二维数组的维数k
    let k = Math.ceil(Math.sqrt(n));
    // console.log(k);
    // 动态分配二维数组
    let a = [];

    for (let i = 0; i < k; i++) {
        a[i] = [];
        for (let j = 0; j < k; j++) {
            a[i][j] = -1;
        }
    }

    // 起始数字
    let num = 1;

    // 方向标志，起初向上
    let flag = 1;

    // 起始位置，视k的奇偶性而定
    let i;
    let j;

    if (oddOrEven(k)) {
        i = parseInt(k / 2);
        j = parseInt(k / 2);
    } else {
        i = k / 2 - 1;
        j = k / 2;
    }

    // fill in the array
    while (true) {
        // 所有数都填完了么？
        if (num > n)
            break;
        // 如果当前位置尚未填充，则填充
        if (a[i] && a[i][j] && a[i][j] === -1)
            a[i][j] = num++;

        // 寻找下一个可填充位置

        // 从左向右
        if (flag === 1) {
            if (a[i + 1] && a[i + 1][j] && a[i + 1][j] === -1) //下边可填充则转向下
            {
                i++;
                flag = 2;
            } else
                j++; //否则继续向右
        }

        // 从上到下
        else if (flag === 2) {
            if (a[i] && a[i][j - 1] && a[i][j - 1] === -1) //左边可填充则转向左
            {
                j--;
                flag = 3;
            } else
                i++; //否则继续向下
        }

        // 从右向左
        else if (flag === 3) {
            if (a[i - 1] && a[i - 1][j] && a[i - 1][j] === -1) //上边可填充则转向上
            {
                i--;
                flag = 4;
            } else
                j--;
        }

        // 从下向上
        else // flag == 4
        {
            if (a[i] && a[i][j + 1] && a[i][j + 1] === -1) //右边可填充则转向右
            {
                j++;
                flag = 1;
            } else
                i--; //否则继续向上
        }
    }

    return a;
}

function oddOrEven(a) {
    if (a % 2 !== 0) {
        return true;
    } else {
        return false;
    }
}

export const uuid = () => {
    return `${'xxxx-xxxx-xxxx'.replace(/x/g, () => Math.floor(Math.random() * 16).toString(16))}`;
}